package Algorithm.interview;

/**
 * @Author self
 * @Date 2024/10/17 20:40
 * @Describe 三个线程顺序打印abc（多种方法，countdownlatch，线程池，completelyablefuture）
 *
 * 该函数通过三个线程按顺序打印字符 'a'、'b' 和 'c'：
 * 创建两个 CountDownLatch 实例 latchB 和 latchC，用于线程间的同步。
 * 创建线程 threadA，打印字符 'a' 并释放 latchB。
 * 创建线程 threadB，等待 latchB 释放后打印字符 'b' 并释放 latchC。
 * 创建线程 threadC，等待 latchC 释放后打印字符 'c'。
 * 启动所有线程并等待它们完成。
 */
import java.util.concurrent.CountDownLatch;

public class PrintABCWithCountDown {
    public static void main(String[] args) throws InterruptedException {
        // 创建CountDownLatch实例，用于线程间的同步
        CountDownLatch latchB = new CountDownLatch(1);
        CountDownLatch latchC = new CountDownLatch(1);

        // 创建线程A，负责打印字符'a'并释放线程B
        Thread threadA = new Thread(() -> {
            System.out.print("a");
            latchB.countDown();  // 释放B
        });

        // 创建线程B，等待线程A释放后打印字符'b'并释放线程C
        Thread threadB = new Thread(() -> {
            try {
                latchB.await();  // 等待A完成
                System.out.print("b");
                latchC.countDown();  // 释放C
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 创建线程C，等待线程B释放后打印字符'c'
        Thread threadC = new Thread(() -> {
            try {
                latchC.await();  // 等待B完成
                System.out.print("c");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 启动所有线程
        threadA.start();
        threadB.start();
        threadC.start();

        // 等待所有线程完成
        threadA.join();
        threadB.join();
        threadC.join();
    }
}

